<template>
  <div class="ldap-config-container">
    <el-form
      ref="formRef"
      :model="form"
      :rules="rules"
      label-width="120px"
      class="config-form"
    >
      <el-form-item label="启用LDAP" prop="enabled">
        <el-switch v-model="form.enabled" @change="handleLdapEnabledChange"></el-switch>
      </el-form-item>
      
      <template v-if="form.enabled">
        <el-form-item label="LDAP服务器" prop="server">
          <el-input v-model="form.server" placeholder="例如：ldap://ldap.example.com:389"></el-input>
        </el-form-item>
        
        <el-form-item label="管理员DN" prop="admindn">
          <el-input v-model="form.admindn" placeholder="例如：cn=admin,dc=example,dc=com"></el-input>
        </el-form-item>
        
        <el-form-item label="管理员密码" prop="password">
          <el-input v-model="form.password" type="password" placeholder="请输入LDAP管理员密码" show-password></el-input>
        </el-form-item>
        
        <el-form-item label="搜索基础DN" prop="basedn">
          <el-input v-model="form.basedn" placeholder="例如：ou=users,dc=example,dc=com"></el-input>
        </el-form-item>
        
        <el-form-item label="用户过滤器" prop="userFilter">
          <el-input v-model="form.userFilter" placeholder="例如：(objectClass=person)"></el-input>
        </el-form-item>
        
        <el-form-item label="用户名属性" prop="userAttribute">
          <el-input v-model="form.userAttribute" placeholder="例如：sAMAccountName或uid"></el-input>
        </el-form-item>
        
        <el-form-item label="邮箱属性" prop="emailAttribute">
          <el-input v-model="form.emailAttribute" placeholder="例如：mail"></el-input>
        </el-form-item>
        
        <el-form-item label="连接超时时间" prop="timeout">
          <el-input-number v-model="form.timeout" :min="1" :max="60" :step="1"></el-input-number>
          <span class="unit-label">秒</span>
        </el-form-item>
        
        <el-form-item>
          <el-button type="primary" @click="testLdapConnection">测试连接</el-button>
        </el-form-item>
        
        <!-- LDAP同步配置 -->
        <el-divider content-position="left">导入LDAP用户至本地</el-divider>
        
        <el-form-item label="导入用户设置">
          <div style="width: 100%;">
            <el-form-item label="LDAP服务器名称" label-width="150px">
              <el-input v-model="ldapServerName" placeholder="例如：szzj" disabled></el-input>
            </el-form-item>
            
            <el-form-item label="导入用户的OU" label-width="150px">
              <el-select v-model="form.import_ou" placeholder="请选择OU" filterable clearable style="width: 100%;">
                <el-option 
                  v-for="ou in ouList" 
                  :key="ou.dn" 
                  :label="ou.name" 
                  :value="ou.dn">
                </el-option>
              </el-select>
              <el-button type="text" @click="loadOuList" style="margin-left: 10px;">刷新OU列表</el-button>
            </el-form-item>
            
            <el-form-item label="用户账号同步策略" label-width="150px">
              <el-radio-group v-model="syncStrategy" disabled>
                <el-radio :label="1">继承LDAP服务器组织结构</el-radio>
                <el-radio :label="2">忽略LDAP组织结构，不分组。</el-radio>
              </el-radio-group>
            </el-form-item>
            
            <el-form-item label="用户账号同步策略" label-width="150px">
              <el-radio-group v-model="userSyncStrategy">
                <el-radio :label="1">与LDAP服务器保持一致（禁用、删除、修改用户账号均同步至本地）</el-radio>
                <el-radio :label="2">仅导入新增用户</el-radio>
              </el-radio-group>
            </el-form-item>
            
            <el-form-item label-width="150px">
              <el-checkbox v-model="form.sync_disabled">同步用户过期时间至本地</el-checkbox>
            </el-form-item>
            
            <el-form-item label-width="150px">
              <el-checkbox v-model="accountDefaultEnable" disabled>
                新导入用户的账号默认启用
              </el-checkbox>
              <span class="hint-text">（开启此项后，用户导入时将不同步LDAP服务器上用户账户的启用状态）</span>
            </el-form-item>
            
            <el-form-item label-width="150px">
              <el-checkbox v-model="form.sync_existing">更新用户手机号</el-checkbox>
              <span class="hint-text">（开启此项后，已导入的用户手机号将更新为LDAP服务器上的手机号信息）</span>
            </el-form-item>
          </div>
        </el-form-item>
        
        <el-form-item>
          <el-button type="primary" @click="syncNow">保存并立即导入</el-button>
        </el-form-item>
        
        <!-- 定时导入设置 -->
        <el-divider content-position="left">定时导入设置</el-divider>
        
        <el-form-item label-width="150px">
          <el-checkbox v-model="form.sync_enabled">启用定时导入</el-checkbox>
        </el-form-item>
        
        <template v-if="form.sync_enabled">
          <el-form-item label="选择任务定义" label-width="150px">
            <el-select 
              v-model="form.task_definition_id" 
              placeholder="请选择定时任务" 
              filterable 
              clearable 
              style="width: 100%;"
              @focus="loadTaskDefinitions">
              <el-option 
                v-for="taskDef in taskDefinitionList" 
                :key="taskDef.id" 
                :label="taskDef.name" 
                :value="taskDef.id">
                <span>{{ taskDef.name }}</span>
                <span style="float: right; color: #8492a6; font-size: 13px; margin-left: 10px;">
                  {{ getTaskTypeText(taskDef.task_type) }}
                </span>
              </el-option>
            </el-select>
            <el-button type="text" @click="loadTaskDefinitions" style="margin-left: 10px;">刷新列表</el-button>
          </el-form-item>
        </template>
      </template>
      
      <el-form-item>
        <el-button type="primary" @click="submitForm">保存配置</el-button>
        <el-button @click="resetForm">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script setup>
import { ref, onMounted, computed } from 'vue'
import requestUtil from '@/util/request'
import { ElMessage, ElMessageBox } from 'element-plus'

const formRef = ref(null)
const form = ref({
  name: 'ldap',
  enabled: false,
  server: '',
  domain: '',
  admindn: '',
  password: '',
  basedn: '',
  userFilter: '(objectClass=person)',
  userAttribute: 'sAMAccountName',
  emailAttribute: 'mail',
  timeout: 10,
  // 同步配置
  sync_enabled: false,  // 启用定时导入
  import_ou: '',  // 导入用户的OU
  sync_disabled: true,  // 同步用户过期时间到本地
  sync_existing: true,  // 更新用户手机号
  task_definition_id: null,  // 选择的任务定义ID
})

// 新增的状态变量
const ldapServerName = ref('szzj')
const ouList = ref([])
const taskDefinitionList = ref([])  // 任务定义列表
const syncStrategy = ref(1)  // 组织结构策略（禁用）
const userSyncStrategy = ref(1)  // 用户同步策略
const accountDefaultEnable = ref(false)  // 账号默认启用（禁用）
const rules = {
  server: [
    { required: true, message: '请输入LDAP服务器地址', trigger: 'blur' }
  ],
  admindn: [
    { required: true, message: '请输入管理员DN', trigger: 'blur' }
  ],
  password: [
    { required: true, message: '请输入管理员密码', trigger: 'blur' }
  ],
  basedn: [
    { required: true, message: '请输入搜索基础DN', trigger: 'blur' }
  ]
}

// 处理LDAP启用状态变化
const handleLdapEnabledChange = (value) => {
  if (!value) {
    // 如果禁用LDAP，可以清空部分字段
    ElMessage.warning('禁用LDAP将使用户无法通过LDAP认证登录')
  }
}

// 加载配置数据
const loadConfig = async () => {
  try {
    // 获取LDAP配置数据
    const res = await requestUtil.get('system/config?name=ldap')
    if (res) {
      console.log('原始返回数据:', res)
      
      // 获取 json_value
      let ldapConfig = {};
      
      // 判断返回数据的结构
      if (Array.isArray(res) && res.length > 0 && res[0].json_value) {
        // 如果是数组，取第一个元素的 json_value
        console.log('JSON值(数组):', res[0].json_value)
        ldapConfig = typeof res[0].json_value === 'string' ? JSON.parse(res[0].json_value) : res[0].json_value;
      } else if (res.json_value) {
        // 如果是单个对象，直接取 json_value
        console.log('JSON值(对象):', res.json_value)
        ldapConfig = typeof res.json_value === 'string' ? JSON.parse(res.json_value) : res.json_value;
      }
      // ldapConfig = res.json_value
      console.log('LDAP配置数据:', ldapConfig)
      
      // 确保表单有默认值
      form.value = {
        name: 'ldap',
        enabled: false,
        server: '',
        admindn: '',
        password: '',
        basedn: '',
        userFilter: '(objectClass=person)',
        userAttribute: 'sAMAccountName',
        emailAttribute: 'mail',
        timeout: 10,
        // 同步配置默认值
        sync_enabled: false,
        import_ou: '',
        sync_disabled: true,
        sync_existing: true,
        task_definition_id: null,
        ...ldapConfig  // 将获取到的配置合并到默认值中
      }
      
      // 更新用户同步策略
      userSyncStrategy.value = form.value.sync_disabled && form.value.sync_existing ? 1 : 2
      
      console.log('表单数据:', form.value)
      
      // 如果LDAP已启用，加载OU列表
      if (form.value.enabled) {
        loadOuList()
      }
    }
  } catch (error) {
    console.error('获取LDAP配置失败', error)
    ElMessage.error('获取LDAP配置失败')
  }
}

// 加载OU列表
const loadOuList = async () => {
  try {
    const res = await requestUtil.post('system/config?name=ldap&ou_list', {})
    if (res && res.success) {
      ouList.value = res.data || []
      if (ouList.value.length > 0) {
        ElMessage.success('获取OU列表成功')
      } else {
        ElMessage.info('未找到可用的OU')
      }
    } else {
      ElMessage.error(res.message || '获取OU列表失败')
    }
  } catch (error) {
    console.error('获取OU列表失败', error)
    ElMessage.error('获取OU列表失败')
  }
}

// 加载任务定义列表
const loadTaskDefinitions = async () => {
  try {
    // 只获取定时任务和周期任务
    const res = await requestUtil.get('tasks/task_definitions/', {
      task_type: 'interval,crontab',
      page_size: 100
    })
    if (res && res.results) {
      taskDefinitionList.value = res.results
      if (taskDefinitionList.value.length > 0) {
        ElMessage.success('获取任务定义列表成功')
      } else {
        ElMessage.info('未找到可用的任务定义，请先在任务管理中创建')
      }
    }
  } catch (error) {
    console.error('获取任务定义列表失败', error)
    ElMessage.error('获取任务定义列表失败')
  }
}

// 获取任务类型文本
const getTaskTypeText = (taskType) => {
  const typeMap = {
    'crontab': '周期任务',
    'interval': '定时任务',
    'clock': '时钟任务',
    'once': '一次性任务'
  }
  return typeMap[taskType] || taskType
}

// 测试LDAP连接
const testLdapConnection = async () => {
  if (!formRef.value) return
  
  try {
    await formRef.value.validate()
    ElMessage.info('正在测试LDAP连接...')
    
    // 发送测试连接请求
    // 直接使用表单数据进行测试，不需要额外包装
    const res = await requestUtil.post('system/config?name=ldap&test', form.value)
    if (res && res.success) {
      ElMessage.success('LDAP连接测试成功')
    } else {
      ElMessage.error(`LDAP连接测试失败: ${res.message || '未知错误'}`)
    }
  } catch (error) {
    console.error('LDAP连接测试失败', error)
    ElMessage.error(`LDAP连接测试失败: ${error.message || '请检查表单数据'}`)
  }
}

// 提交表单
const submitForm = () => {
  if (!formRef.value) {
    console.error('表单引用不存在');
    return;
  }
  
  formRef.value.validate(async (valid) => {
    if (valid) {
      try {
        // 直接提交表单数据，已包含 name 属性
        console.log('提交的配置数据:', form.value);
        
        // 保存LDAP配置
        await requestUtil.post('system/config?name=ldap', form.value)
        ElMessage.success('LDAP配置保存成功')
        
        // 处理定时同步任务
        if (form.value.sync_enabled) {
          await createOrUpdateSyncTask()
        }
        
        loadConfig()
      } catch (error) {
        console.error('保存LDAP配置失败', error)
        ElMessage.error('保存LDAP配置失败')
      }
    } else {
      ElMessage.warning('请填写必填字段')
      return false
    }
  })
}

// 立即同步
const syncNow = async () => {
  if (!formRef.value) return
  
  try {
    // 先验证表单
    await formRef.value.validate()
    
    // 确认同步
    await ElMessageBox.confirm(
      '确认立即导入LDAP用户？此操作可能需要一些时间。',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }
    )
    
    ElMessage.info('正在同步LDAP用户...')
    
    // 先保存配置
    await requestUtil.post('system/config?name=ldap', form.value)
    
    // 执行同步
    const syncData = {
      import_ou: form.value.import_ou,
      sync_disabled: form.value.sync_disabled,
      sync_existing: form.value.sync_existing
    }
    
    const res = await requestUtil.post('system/config?name=ldap&sync', syncData)
    if (res && res.success) {
      ElMessage.success(res.message || '同步成功')
      console.log('同步结果:', res)
    } else {
      ElMessage.error(res.message || '同步失败')
    }
    
    // 处理定时同步任务
    if (form.value.sync_enabled) {
      await createOrUpdateSyncTask()
    }
  } catch (error) {
    if (error !== 'cancel') {
      console.error('LDAP同步失败', error)
      ElMessage.error(`LDAP同步失败: ${error.message || '请检查表单数据'}`)
    }
  }
}

// 创建或更新定时同步任务
const createOrUpdateSyncTask = async () => {
  try {
    // 任务的创建和更新由后端自动处理
    // 当保存LDAP配置时，后端会根据sync_enabled参数自动创建或禁用任务
    console.log('LDAP同步任务已由后端自动处理')
  } catch (error) {
    console.error('配置定时同步任务失败', error)
    throw error
  }
}

// 重置表单
const resetForm = () => {
  if (formRef.value) {
    formRef.value.resetFields()
  }
}


// 组件挂载时加载配置
onMounted(() => {
  loadConfig()
})

</script>

<style lang="scss" scoped>
.ldap-config-container {
  padding: 20px;
}

.config-form {
  max-width: 800px;
  margin: 0 auto;
}

.unit-label {
  margin-left: 8px;
  color: #606266;
}

.hint-text {
  font-size: 12px;
  color: #909399;
  margin-left: 8px;
}

.el-divider {
  margin: 30px 0 20px 0;
}
</style>
